import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.regex.Matcher;

/**
 * Created by lrs on 2017/12/30.
 */
public class Handle {

    /**
     * 使用文本查询的方式处理
     * 例如：<div class="top-main">xxxxx</div></div> 文本需要替换则设置
     *  txtHandle.setStartStr("<div class=\"top-main\">");
        txtHandle.setStartNum(1); // 第一个出现<div class="top-main">的地方
        txtHandle.setEndStr("</div>");
        txtHandle.setEndNum(2); // 第一个出现</div>的地方
        txtHandle.setReplaceStartStrAndEndStr(true); // 替换后不包括<div class="top-main">xxxxx和第二个</div>
     * @param source 原目录
     * @param target 目标目录
     * @param txtHandleList
     */
    public void handleFile(String fileName, String source, String target, LinkedList<TxtHandle> txtHandleList) {
        String sourceStr = HandleFile.readFile(source); // 读取待处理字符串

        sourceStr = this.handleFile(fileName, source, target, sourceStr, null);

        try {
            this.writeFile(target, sourceStr); // 写入字符到目标文件中
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 处理一组“使用文本查询的方式处理”
     * @param fileName
     * @param txtHandle
     * @return
     */
    private String handleFile(String fileName, String source, String target, String sourceStr, TxtHandle txtHandle) {
        Matcher imgMatcher = WebResRepair.imgHtmlPattern.matcher(sourceStr);
        while (imgMatcher.find()) {
            String str = oneLineHtml(fileName, source, target, imgMatcher.group(0));
            if (str.trim().length() != 0) {
                sourceStr = sourceStr.replace(imgMatcher.group(0), str);
            }
        }

        return sourceStr;
    }

    /**
     *
     * @param fileName 文件名
     * @param source 源文件名
     * @param target 目标文件名
     * @param htmlStr 一个html元素字符串
     */
    private String oneLineHtml(String fileName, String source, String target, String htmlStr) {
        String retStr = "";
        String path = getPath(fileName, source);

        // 查找src名称
        Matcher srcMatcher = WebResRepair.srcPattern.matcher(htmlStr);
        srcMatcher.find();
        String src = srcMatcher.group(1); // src文件名

        String srcFileName = path + src;

        // 查询图片是否存在
        if (!isFileExist(srcFileName)) {
            // 生成目标文件名
            String targetPath = getPath(fileName, target);
            String targetImgFileName = targetPath + src;

            // 查找原始资源路径
            Matcher tppabsMatcher = WebResRepair.tppabsPattern.matcher(htmlStr);
            tppabsMatcher.find();
            String tppabs = tppabsMatcher.group(1); //tppabs文件名

            // 如果src名称中包括html或htm则改为jpg
            if (src.indexOf(".html")!=-1 || src.indexOf(".htm")!=-1) {
                String changeFileName = src.replace(".html", ".jpg").replace(".htm", "jpg");
                retStr = htmlStr.replace(src, changeFileName);
                targetImgFileName = targetImgFileName.replace(".html", ".jpg").replace(".htm", "jpg");
            }

           Network.get(tppabs, targetImgFileName); // 下载缺失资源
        }

        return retStr;
    }

    /**
     * 判断文件是否存在
     * @param name 文件名
     * @return true存在 false不存在
     */
    private boolean isFileExist(String name) {
        File file = new File(name);
        return file.exists();
    }

    /**
     * 返回路径
     * @param fileName 文件名
     * @param allFileName 全文件名，包含路径
     * @return
     */
    private String getPath(String fileName, String allFileName) {
        String path = allFileName.replace(fileName, "");
        return path;
    }

    /**
     * 处理一个目录
     * @param file File对象
     * @param source
     * @param target
     */
    public void directory(File file, String source, String target) {
        String fullDir = file.getAbsolutePath().replace("\\", "/"); // 全路径
        String relativeDir = fullDir.replace(source, "");// 相对路径
        String fullTargetDir = target + "/" + relativeDir; // 目标全目标路径

        // 目标目录不存在则创建
        File targetDir = new File(fullTargetDir);
        HandleFile.judeDirExists(targetDir);
    }

    /**
     * 将处理好的字符串写入目标文件
     * @param target
     * @param fileStr
     * @throws Exception
     */
    private void writeFile(String target, String fileStr) throws IOException {
        // 写入字符到目标文件中
        FileWriter fout = new FileWriter(target);// 创建文件输出流
        fout.write(fileStr.toCharArray());// 把替换完成的字符串写入文件内
        fout.close();// 关闭输出流
    }

}
